package imagesBuffer;

import imageViewer.ImageReloader;
import android.graphics.Bitmap;

public class ArrayBitmapBuffer {
	private BufferableBitmap[] images;
	private int position;
	private ImageReloader imageOwner;
	
	/**
	 * @param paths l'insieme dei percorsi delle immagini da caricare
	 * @param initialPosition posizione della prima immagine da visualizzare 
	 * 		rispetto all'array
	 * @param imageOwner oggetto che necessita di visualizzare le immagini
	 */
	public ArrayBitmapBuffer(String[] paths,int initialPosition,ImageReloader imageOwner){
		images=new BufferableBitmap[paths.length];
		if(initialPosition>paths.length||initialPosition<0){
			initialPosition=0;
		}
		position=initialPosition;
		for(int i=0;i<paths.length;i++){
			images[i]=new BufferableBitmap(paths[i]);
		}
		this.imageOwner=imageOwner;
		refresh();
	}
	
	/**
	 * passa all'immagine successiva
	 */
	public void next(){
		if(position>=images.length-1){
			return;
		}
		position++;
		refresh();
	}
	
	/**
	 * passa all'immagine precedente
	 */
	public void	prev(){
		if(position<=0){
			return;
		}
		position--;
		refresh();
	}
	
	/**
	 * lancia diversi thread per caricare completamente l'immagine selezionata,
	 * bufferizzare quelle vicine e togliere dalla memoria quelle più lontane
	 */
	public void refresh(){
		for(int i=0;i<images.length;i++){
			if(i==position){
				ImageStateChangerRunnable.changeImageState(images[i],
						ImageState.fullLoaded, imageOwner);
			}else if(i>position-5&&i<position+5){ 
				if(images[i].getState()==ImageState.outOfMemory){
					ImageStateChangerRunnable.changeImageState(images[i],
							ImageState.buffered, imageOwner);
				}
			}else if(i>position-7&&i<position+7){
				ImageStateChangerRunnable.changeImageState(images[i],
						ImageState.outOfMemory, imageOwner);
			}
		}
	}
	
	/**
	 * @return l'immagine corrispondente alla posizione attuale del puntatore
	 */
	public Bitmap getCurrentImage() {
		return images[position].getBitmap();
	}
}
